

package io.webchat.utils;

import io.jsonwebtoken.*;
import io.webchat.exception.RRException;
import io.webchat.wdzl.pojo.Token;
import io.webchat.wdzl.pojo.User;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * jwt工具类

 */
@Component
@ConfigurationProperties(prefix = "webchat.jwt")
@Data
public class JwtUtils {

    private Logger logger = LoggerFactory.getLogger(getClass());


    private String secret;

    private Long  expire;



    public  String generateToken(Token tokenEntity){


        Date nowDate = new Date();
        //过期时间
        Date expireDate = new Date(nowDate.getTime() + expire);
        String token = Jwts.builder()
                .setSubject(tokenEntity.getUserName())//用于说明该JWT面向的对象
                .claim(Constant.USER_KEY,tokenEntity.getUserId())//自定义参数
                .setIssuer("webChat")//用于说明该JWT是由谁签发的
                .setIssuedAt(nowDate)//数字类型，说明该JWT何时被签发
                .setExpiration(expireDate)//数字类型，说明该JWT过期的时间
                .signWith(SignatureAlgorithm.HS512, secret)//加密方式
                .compact();
        return token;
    }

    /**
     * 公钥解析token
     *
     * @param token
     * @return
     * @throws Exception
     */
    public Claims parserToken(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(secret)
                    .parseClaimsJws(token)
                    .getBody();
        }catch (Exception e){
            logger.debug("validate is token error ", e);
            throw new RRException("token无效，请重新登录",10001);
        }
    }

    /**
     * 获取token中的用户信息
     *
     * @param token
     * @return
     * @throws Exception
     */
    public String getUserId(String token){

        return parserToken(token).get(Constant.USER_KEY).toString();

    }
//
//    /**
//     * 获取token中的claims信息
//     *
//     * @param token
//     * @param pubKey
//     * @return
//     * @throws Exception
//     */
//    public static Claims  getClaimsFromToken(String token, String pubKey) throws ZuulException {
//        String[] header = token.split("Bearer");
//        token = header[1];
//        Claims body = parserToken(token, pubKey);
//        return body;
//    }
//
//    /**
//     * token是否过期
//     * @return  true：过期
//     */
//    public static boolean isTokenExpired(Date expiration) {
//        return expiration.before(new Date());
//    }
//
//    /**
//     * 刷新token的过期时间
//     * @param token
//     * @param pubKey
//     * @throws Exception
//     */
//    public static void refreshToken(String token, String pubKey,int expire) throws ZuulException {
//        String[] header = token.split("Bearer");
//        token = header[1];
//        Claims body = parserToken(token, pubKey);
//        Jwts.builder().setClaims(body).setExpiration(DateTime.now().minusSeconds(expire).toDate());
//    }



}
